By default, Scanbox displays the incoming image stream on its main window. Thus, during volumetric scanning, one sees the incoming images as depth is changing over time. If one is imaging only a handful of optical planes, it is difficult to see what is really going on.
A different way to visualize the data in such recordings is to have a montage showing the different optical sections separately, each being updated as new data becomes available. Here, we offer a plug-in for Scanbox that implements this mode of visualization.
As discussed in previous examples, Scanbox shares date with other processing by means of memory-mapped files. A header at the beginning of the file provides a mechanism for exclusive access to the data via a semaphore and exposes basic information about the data, such as the size of the images, the frame # being shared at any one time, and the period (in frames) of the volumetric scanning waveform, among other information.
Such data, along with a readily available montage function from Matlab, allows one to easily display the data as separate optical planes during acquisition.
Here is the code:
% Plug-in Demo: Display optical sections separately
close all; % Close all open figs
% Open memory mapped file -- define just the header first
mmfile = memmapfile('scanbox.mmap','Writable',true, ...
'Format', { 'int16' [1 16] 'header' } , 'Repeat', 1);
flag = 1;
% Process all incoming frames until Scanbox stops
while(true)
while(mmfile.Data.header(1)<0) % wait for a new frame...
if(mmfile.Data.header(1) == -2) % exit if Scanbox stopped
return;
end
end
if(flag) % first time? Format chA according to lines/columns in data
mmfile.Format = {'int16' [1 16] 'header' ; ...
'uint16' double([mmfile.Data.header(2) mmfile.Data.header(3)]) 'chA'};
mchA = double(intmax('uint16')-mmfile.Data.chA);
flag = 0;
nplanes = mmfile.Data.header(6);
I = zeros([size(mchA) 1 nplanes]);
I(:,:,1,1) = mchA;
imaqmontage(I);
axis off; % remove axis
colormap gray; % use gray colormap
else
I(:,:,1,mod(mmfile.Data.header(1),nplanes)+1) = double(intmax('uint16')-mmfile.Data.chA);
imaqmontage(I);
end
mmfile.Data.header(1) = -1; % signal Scanbox that frame has been consumed!
drawnow limitrate;
end
clear(mmfile); % close the memory mapped file
close all; % close all figures
And here are, side-by-side, the result of viewing the incoming stream in the main Scanbox window and in the volumetric plug-in.